package chans

import (
	"fmt"
	"math/rand"
)

/*
协程池

需求：
生成随机数，计算这个随机数各位之和

思路：
一个放随机数的通道randCh，一个放计算结果的通道sumCh；
将随机数发送到randCh，通过开启协程接收随机数计算结果，然后将结果发送到结果通道
最后range结果通道数据
*/

func CalcuRandSum() {
	// 两个通道：带有长度
	var randCh = make(chan int, 128)
	var sumCh = make(chan int, 128)

	// 创建协程工作池
	sumPool(randCh, sumCh, 64)

	// 从sumCh中接收数值:开启打印协程
	go func(sumCh chan int) {
		for sum := range sumCh {
			fmt.Println("sum:=", sum)
		}
	}(sumCh)

	// 向randCh中发送随机数
	for {
		randCh <- rand.Int()
	}

}

/*
	从randCh中得到随机数进行计算求和，然后将和值发送到sumCh
*/
func sumPool(randCh chan int, sumCh chan int, len int) {
	// len用来控制一次性最多开启多少个计算协程
	for i := 0; i < len; i++ {
		// 计算协程
		go func(randCh <-chan int, sumCh chan<- int) {
			// range randCh，得到随机数
			for rand := range randCh {
				// 计算结果
				var sum int
				for rand != 0 {
					tmp := rand % 10
					sum += tmp
					// 去尾
					rand /= 10
				}
				// 将计算结果发送到sumCh
				sumCh <- sum
			}

		}(randCh, sumCh)
	}
}
